<!DOCTYPE html>
<html lang="en">
<head>

<meta charset="utf-8" />
<link rel="icon" href="favicon.png" />
<title>Autoloader ▲ Prism plugins</title>
<base href="../.." />
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="themes/prism.css" data-noprefix />
<style>
	.download-grammars {
		font: inherit;
		border: 0;
		padding: 0;
		margin: 0;
		background: none;
		text-decoration: underline;
		cursor: pointer;
	}
	.download-grammars.loading:after {
		content: ' [Generating... ' attr(data-progress) '%]';
	}
</style>
<script src="prefixfree.min.js"></script>

<script>var _gaq = [['_setAccount', 'UA-33746269-1'], ['_trackPageview']];</script>
<script src="https://www.google-analytics.com/ga.js" async></script>
</head>
<body>

<header>
	<div class="intro" data-src="templates/header-plugins.html" data-type="text/html"></div>

	<h2>Autoloader</h2>
	<p>Automatically loads the needed languages to highlight the code blocks.</p>
</header>

<section class="language-javascript">
	<h1>How to use</h1>

	<p>
		The plugin will automatically handle missing grammars and load them for you.
		To do this, you need to provide it with a directory of all the grammars you want.
	</p>
	<p>
		You can download all the available grammars by clicking on the following link: <button class="download-grammars" type="button">download all grammars</button>.<br />
		Alternatively, you can also clone the GitHub repo and take the <code>components</code> folder from there.
	</p>
	<p>
		You can then download Prism core and any plugins from the <a href="download.html">Download</a> page, without checking any languages (or just check the languages you want to load by default, e.g. if you're using a language a lot, then you probably want to save the extra HTTP request).
	</p>
	<p>
		A couple of additional options are available through the configuration object <code>Prism.plugins.autoloader</code>.
	</p>

	<h2>Specifying the grammars path</h2>

	<p>
		By default, the plugin will look for the missing grammars in the <code>components</code> folder.
		If your files are in a different location, you can specify it using the <code>languages_path</code> option:
	</p>

	<pre><code>Prism.plugins.autoloader.languages_path = 'path/to/grammars/';</code></pre>

	<h2>Using development versions</h2>

	<p>
		By default, the plugin uses the minified versions of the grammars.
		If you wish to use the development versions instead, you can set the <code>use_minified</code> option to false:
	</p>

	<pre><code>Prism.plugins.autoloader.use_minified = false;</code></pre>

	<h2>Specifying additional dependencies</h2>

	<p>
		All default dependencies are already included in the plugin.
		However, there are some cases where you might want to load an additional dependency for a specific code block.
		To do so, just add a <code>data-dependencies</code> attribute on you <code>&lt;code></code> or <code>&lt;pre></code> tags,
		containing a list of comma-separated language aliases.
	</p>

	<pre><code class="language-markup">&lt;pre>&lt;code class="language-pug" data-dependencies="less">
:less
	foo {
		color: @red;
	}
&lt;/code>&lt;pre></code></pre>

	<h2>Force to reload a grammar</h2>

	<p>
		The plugin usually doesn't reload a grammar if it already exists.
		In some very specific cases, you might however want to do so.
		If you add an exclamation mark after an alias in the <code>data-dependencies</code> attribute,
		this language will be reloaded.
	</p>

	<pre><code class="language-markup">&lt;pre class="language-markup" data-dependencies="markup,css!">&lt;code></code></pre>

</section>

<section>
	<h1>Examples</h1>

	<p>Note that no languages are loaded on this page by default.</p>

	<p>Basic usage with some Perl code:</p>
	<pre><code class="language-perl">my ($class, $filename) = @_;</code></pre>

	<p>The Less filter used in Pug:</p>
	<pre><code class="language-pug" data-dependencies="less">:less
	foo {
		color: @red;
	}</code></pre>

</section>

<footer data-src="templates/footer.html" data-type="text/html"></footer>

<script src="components/prism-core.js"></script>
<script src="plugins/autoloader/prism-autoloader.js" data-autoloader-path="components"></script>
<script src="utopia.js"></script>
<script src="components.js"></script>
<script src="code.js"></script>

<script src="vendor/promise.js"></script>
<script src="vendor/jszip.min.js"></script>
<script src="vendor/FileSaver.min.js"></script>
<script>
	function getZip(files, elt) {
		return new Promise(function (resolve, reject) {
			var zip = new JSZip();
			var l = files.length;
			var i = 0;
			var process = function () {
				elt.setAttribute('data-progress', Math.round(i / l * 100));
				if (i < l) {
					addFile(zip, files[i][0], files[i][1]).then(function () {
						i++;
						process();
					});
				} else {
					resolve(zip);
				}
			};
			process();
		});
	}

	function addFile(zip, filename, filepath) {
		return getFileContents(filepath).then(function (contents) {
			zip.file(filename, contents);
		});
	}

	function getFileContents(filepath) {
		return new Promise(function (resolve, reject) {
			$u.xhr({
				url: filepath,
				callback: function (xhr) {
					if (xhr.status < 400 && xhr.responseText) {
						resolve(xhr.responseText);
					} else {
						// Never rejected, ignore errors
						resolve();
					}
				}
			});
		});
	}

	$('.download-grammars').addEventListener('click', function () {
		var btn = this;
		if (btn.classList.contains('loading')) {
			return;
		}
		btn.classList.add('loading');
		btn.setAttribute('data-progress', 0);

		var files = [];
		for (var id in components.languages) {
			if (id === 'meta') {
				continue;
			}
			var basepath = components.languages.meta.path.replace(/\{id}/g, id);
			var basename = basepath.substring(basepath.lastIndexOf('/') + 1);
			files.push([basename + '.js', basepath + '.js']);
			files.push([basename + '.min.js', basepath + '.min.js']);
		}

		getZip(files, btn).then(function (zip) {
			btn.classList.remove('loading');
			return zip.generateAsync({type: 'blob'});
		}).then(function (blob) {
			saveAs(blob, 'prism-components.zip');
		});
	});

</script>

</body>
</html>
